package ru.vyarus.dropwizard.orient.configuration.deserializer;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
/**
* Simplifies configuration deserialization for key - value classes. Normally such configuration must be written
* in two lines: key and value, but this handler allows one line mapping: key: value.
* <p>
* Implementation must simply implement key and value binding to provided instance.
*
* @param <T> deserializable type (key-value like properties)
* @author Vyacheslav Rusakov
* @since 21.02.2017
*/
public abstract class AbstractPairDeserializer<T> extends DeserializationProblemHandler {
private final Class<T> type;
@SuppressWarnings("unchecked")
protected AbstractPairDeserializer() {
this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
@SuppressWarnings("unchecked")
public boolean handleUnknownProperty(final DeserializationContext ctxt, final JsonParser jp,
final JsonDeserializer<?> deserializer, final Object beanOrClass,
final String propertyName) throws IOException {
if (beanOrClass != null && type.isAssignableFrom(beanOrClass.getClass())) {
configure((T) beanOrClass, propertyName, jp.getValueAsString());
return true;
}
return false;
}
protected abstract void configure(T object, String key, String value);
}